package models

import (
	"errors"
	"fmt"
	"gorm.io/gorm"
	"time"
)

// TeamProject 结构体与 team_projects 表绑定
type TeamProject struct {
	ID        uint64    `gorm:"column:id;primaryKey;autoIncrement" json:"id" form:"id"`
	TeamID    uint64    `gorm:"column:team_id;notNull" json:"team_id" form:"team_id"`
	ProjectID uint64    `gorm:"column:project_id;notNull" json:"project_id" form:"project_id"`
	CreatedAt time.Time `gorm:"column:created_at;default:CURRENT_TIMESTAMP" json:"created_at" form:"created_at"`
	UpdatedAt time.Time `gorm:"column:updated_at;default:CURRENT_TIMESTAMP;updateDefault:CURRENT_TIMESTAMP" json:"updated_at" form:"updated_at"`
}

// TableName 返回绑定的表名
func (TeamProject) TableName() string {
	return "team_projects"
}

//	GetProjectIDByTeamID
//
// 描述信息： 根据 teamID 返回对应的 projectID
//
// Param：
//
//	db ：数据库连接实例
//	teamID ：团队id
//
// Return：
//
//	uint64 ：项目id  or  0 表示没有找到记录
//	error ：错误信息
func GetProjectIDByTeamID(db *gorm.DB, teamID uint64) (uint64, error) {
	var teamProject TeamProject
	result := db.Where("team_id = ?", teamID).First(&teamProject)
	if result.Error != nil {
		if errors.Is(result.Error, gorm.ErrRecordNotFound) {
			return 0, nil // 如果没有找到记录，返回零值
		}
		return 0, result.Error // 如果是其他错误，返回错误
	}
	return teamProject.ProjectID, nil
}

//	GetTeamIDByProjectID
//
// 描述信息： 根据 projectID 返回对应的 teamID
//
// Param：
//
//	db ：数据库连接实例
//	projectID ：项目id
//
// Return：
//
//	uint64 ：团队id  or  0表示没有找到记录
//	error ：错误信息
func GetTeamIDByProjectID(db *gorm.DB, projectID uint64) (uint64, error) {
	var teamProject TeamProject
	result := db.Where("project_id = ?", projectID).First(&teamProject)
	if result.Error != nil {
		if errors.Is(result.Error, gorm.ErrRecordNotFound) {
			return 0, nil // 如果没有找到记录，返回零值
		}
		return 0, result.Error // 如果是其他错误，返回错误
	}
	return teamProject.TeamID, nil
}

//	GetProjectIDsByTeamIDs
//
// 描述信息： 根据 teamID 切片查询每个 teamID 对应的 projectID
//
// Param：
//
//	db ：数据库连接实例
//	teamIDs ：团队id切片
//
// Return：
//
//	[]uint64 ：团队项目id切片
//	error ：错误信息
func GetProjectIDsByTeamIDs(db *gorm.DB, teamIDs []uint64) ([]uint64, error) {
	var projectIDs []uint64

	for _, teamID := range teamIDs {
		projectID, err := GetProjectIDByTeamID(db, teamID)
		if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, err // 如果查询过程中出现错误，直接返回错误
		}
		if projectID != 0 {
			projectIDs = append(projectIDs, projectID) // 如果找到对应的 projectID，添加到结果列表中
		}
	}

	return projectIDs, nil
}

//	GetTeamProjects
//
// 描述信息： 获取 team_projects 表中的全部数据
//
// Param：
//
//	db ：数据库连接实例
//
// Return：
//
//	[]TeamProject ：[]TeamProject 返回全部信息切片
//	error ：错误
func (tp TeamProject) GetTeamProjects(db *gorm.DB) ([]TeamProject, error) {
	var teamProjects []TeamProject
	result := db.Find(&teamProjects)
	if result.Error != nil {
		return nil, result.Error
	}
	return teamProjects, nil
}

// DeleteTeamProjectByTeamID 根据 team_id 删除所有相关的 TeamProject 记录
func (t TeamProject) DeleteTeamProjectByTeamID(db *gorm.DB, teamID uint64) error {
	result := db.Where("team_id = ?", teamID).Delete(&TeamProject{})
	if result.Error != nil {
		return fmt.Errorf("failed to delete team projects with team_id %d: %w", teamID, result.Error)
	}
	return nil
}
